package com.sbdev;


import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * 应用程序的入口点。
 * 使用@SpringBootApplication注解标记这个类作为Spring Boot应用程序的起点。
 * scanBasePackages属性指定了Spring应用程序上下文应该扫描的包，即在这个包及其子包下寻找组件（如控制器、服务、配置类等）。
 * 这里指定的包是"com.sbdev"，意味着所有在这个包下面的组件都会被Spring Boot自动识别和管理。
 */
@SpringBootApplication(
        scanBasePackages = "com.sbdev"
)


/**
 * 配置MyBatis的Mapper扫描器。
 * 通过此注解，Spring Boot将自动扫描指定包下的所有Mapper接口，并将其注册到MyBatis的SqlSessionFactory或SqlSessionTemplate中。
 * @param basePackages 指定需要扫描的Mapper接口所在的包。Spring Boot会递归扫描指定包及其子包下的所有接口。
 * @param annotationClass 指定需要扫描的接口上应存在的注解。这里指定为@Mapper，意味着只有标注了@Mapper注解的接口才会被扫描和处理。
 * @param sqlSessionFactoryRef 指定SqlSessionFactory的Bean名称。扫描到的Mapper接口将使用这个SqlSessionFactory来创建SqlSession。
 * @param sqlSessionTemplateRef 指定SqlSessionTemplate的Bean名称。扫描到的Mapper接口将使用这个SqlSessionTemplate来执行SQL操作。
 */
@MapperScan(
        basePackages = "com.sbdev",
        annotationClass = Mapper.class,
        sqlSessionFactoryRef = "sqlSessionFactory",
        sqlSessionTemplateRef = "sqlSessionTemplate"
)

@EnableCaching
public class SbDevApplication {

    public static void main(String[] args) {
        SpringApplication.run(SbDevApplication.class, args);
    }

    // 注入Redis连接工厂
    @Autowired
    private RedisConnectionFactory redisConnectionFactory = null;

    // 自定义RedisTemplate
    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 默认为JDK序列化器
        redisTemplate.setDefaultSerializer(RedisSerializer.java());
        // key采用字符串序列化器
        redisTemplate.setKeySerializer(RedisSerializer.string());
        // value采用JDK序列化器
        redisTemplate.setValueSerializer(RedisSerializer.java());
        // 哈希结构key字段采用字符串序列化器
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 哈希结构value字段采用JDK序列化器
        redisTemplate.setHashValueSerializer(RedisSerializer.java());
        return redisTemplate;
    }
}